package cn.wolfocde.wolf2w.service.impl;

import cn.wolfocde.wolf2w.domain.UserInfo;
import cn.wolfocde.wolf2w.redis.service.IUserInfoRedisService;
import cn.wolfocde.wolf2w.repository.UserInfoRepository;
import cn.wolfocde.wolf2w.service.IUserInfoService;
import cn.wolfocde.wolf2w.util.AssertUtil;
import cn.wolfocde.wolf2w.util.Consts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.security.auth.login.LoginException;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class UserInfoServiceImpl implements IUserInfoService {
    @Autowired
    private UserInfoRepository userInfoRepository;
    @Autowired
    private IUserInfoRedisService userInfoRedisService;
    @Override
    public void save(UserInfo userInfo) {
        //修改和保存操作共用save方法
        userInfo.setId(null);
        userInfoRepository.save(userInfo);
    }

    @Override
    public void update(UserInfo userInfo) {
        //修改和保存操作共用save方法

        userInfoRepository.save(userInfo);
    }

    @Override
    public void delete(String id) {
        userInfoRepository.deleteById(id);
    }

    @Override
    public UserInfo get(String id) {
        UserInfo userInfo = userInfoRepository.findById(id).orElse(null);
        userInfo.setPassword("");
        return userInfo ;
    }

    @Override
    public List<UserInfo> list()
    {
        return userInfoRepository.findAll();
    }

    @Override
    public boolean findByPhone(String phone) {
        UserInfo user = userInfoRepository.findByPhone(phone);
//        user对象有值是不等于空值的,就返回true,说明账号(用户对象)已经存在数据库,不能注册,
        return user!=null;//返回true,查到user对象了,不能注册账号
    }


    @Override
    public void regist(String nickname, String phone,
                       String password, String rpassword, String verifyCode) {


        AssertUtil.hasLength(nickname,"昵称不能为空");
        AssertUtil.hasLength(password,"密码不能为空");
        AssertUtil.hasLength(rpassword,"确认密码不能为空");
        AssertUtil.hasLength(phone,"手机号不能为空");
        AssertUtil.hasLength(verifyCode,"手机短信验证码不能为空");
        //判断密码和确认密码是不是一样,不一样就抛异常提示用户
        AssertUtil.isEquals(password,rpassword,"2次输入的密码不一致");
        //前缀+手机号拼接成key,获取出手号对应的验证码
        String verify_code = userInfoRedisService.getVerifyCode(phone);
        //判断用户传来的验证码和确redis的验证码是不是一样,不一样就抛异常提示用户
        AssertUtil.isEquals(password,rpassword,"输入的验证码不正确");
        UserInfo userInfo = new UserInfo();
        userInfo.setNickname(nickname);
        userInfo.setPassword(password);
        userInfo.setPhone(phone);
        userInfo.setHeadImgUrl("/images/default.png");
//上面流程不抛异常就继续执行注册账号操作:
        userInfoRepository.save(userInfo);


//         throw new RuntimeException("xxxdff777fllvnbg23rbbgk4gmm4k4bb4kg 4");
    }


    //用户登录
    @Override
    public UserInfo login(String username, String password) {
        //根据手机号查询用户对象
        UserInfo user = userInfoRepository.findByPhone(username);
        //对象是空,或者密码不同,就抛异常(相反的话,就是数据库有这个账号,可以继续登录访问)
           if (user==null||!user.getPassword().equals(password)) {
                throw new RuntimeException("密码或者手机号错误");
           }
        //不在这里调用设置token的方法,这个专门做登录

        //能够返回到控制器,说明密码和手机号是正确的

        //用户对象要返回到前端页面的必须设置密码为空,不然不安全
        //设置为空,再返回到前端页面;数据库的没有改变.因为是那个只是查询出来,没有修改数据库的密码
        user.setPassword("");
        return user;
    }


}
